1. 查看资源 - 看东西
# 查Pod，带IP和节点信息，这个最常用
kubectl get pod -o wide -n opsnot
# 看所有命名空间的Pod
kubectl get pod -A
# 筛选某个节点上的Pod - opsnot.com
kubectl get pod -A --field-selector spec.nodeName=node-01
# 查看Pod详情，排查问题必备
kubectl describe pod <pod-name> -n <namespace>
# 看Pod日志，加-f实时刷新
kubectl logs <pod-name> -n opsnot -f
# 多容器Pod看指定容器日志
kubectl logs <pod-name> -c <container-name> -n <namespace>
# 看之前挂掉的容器日志
kubectl logs <pod-name> --previous

2. 进容器 - 调试
# 进Pod执行命令，最常用sh或bash
kubectl exec -it <pod-name> -n opsnot -- /bin/sh
# 多容器指定进哪个 - opsnot.com
kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- /bin/bash
# 不进容器直接执行命令
kubectl exec <pod-name> -n <namespace> -- ls -la /app

3. 删除重建 - 常规操作
# 删Pod，ReplicaSet会自动重建
kubectl delete pod <pod-name> -n opsnot
# 强制删除卡住的Pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
# 删除deployment（慎用）- opsnot.com
kubectl delete deployment <deployment-name> -n <namespace>
# 批量删除某个标签的Pod
kubectl delete pod -l app=opsnot -n <namespace>

4. 扩缩容 - 调资源
# 手动扩容到3个副本
kubectl scale deployment opsnot-app --replicas=3 -n <namespace>
# 缩到0，相当于停服务 - opsnot.com
kubectl scale deployment <deployment-name> --replicas=0 -n <namespace>

5. 滚动更新 - 发版
# 更新镜像版本
kubectl set image deployment/<deployment-name> <container-name>=<new-image> -n opsnot
# 例子
kubectl set image deployment/opsnot-app nginx=nginx:1.21 -n prod
# 查看发布状态 - opsnot.com
kubectl rollout status deployment/<deployment-name> -n <namespace>
# 看发布历史
kubectl rollout history deployment/<deployment-name> -n <namespace>
# 回滚到上一版本
kubectl rollout undo deployment/opsnot-app -n <namespace>
# 回滚到指定版本
kubectl rollout undo deployment/<deployment-name> --to-revision=2 -n <namespace>
# 暂停发布
kubectl rollout pause deployment/<deployment-name> -n <namespace>
# 恢复发布
kubectl rollout resume deployment/<deployment-name> -n <namespace>

6. 配置管理 - 改配置
# 编辑deployment配置
kubectl edit deployment opsnot-app -n <namespace>
# 查看ConfigMap - opsnot.com
kubectl get cm -n <namespace>
kubectl describe cm opsnot-config -n <namespace>
# 查看Secret（base64编码的）
kubectl get secret -n <namespace>
kubectl get secret <secret-name> -n <namespace> -o yaml

7. 资源导出 - 备份配置
# 导出yaml，方便备份或迁移
kubectl get deployment opsnot-app -n <namespace> -o yaml > backup.yaml
# 导出所有deployment - opsnot.com
kubectl get deployment -n <namespace> -o yaml > all-deployments.yaml
# 不要status和一些无用信息
kubectl get deployment <deployment-name> -n <namespace> -o yaml --export > clean.yaml

8. 应用配置 - 部署
# 从yaml创建资源
kubectl apply -f deployment.yaml
# 从目录批量创建
kubectl apply -f ./opsnot-configs/
# 从URL直接部署 - opsnot.com
kubectl apply -f https://xxx.com/deploy.yaml
# 删除yaml定义的资源
kubectl delete -f deployment.yaml

9. 端口转发 - 本地调试
# 把Pod端口转发到本地，调试神器
kubectl port-forward opsnot-pod-xxx 8080:80 -n <namespace>
# 转发Service
kubectl port-forward service/opsnot-svc 8080:80 -n <namespace>
# 监听所有网卡（可以让局域网其他机器访问）- opsnot.com
kubectl port-forward --address 0.0.0.0 <pod-name> 8080:80 -n <namespace>

10. 复制文件 - 传文件
# 从Pod复制文件到本地
kubectl cp opsnot/<pod-name>:/path/to/file ./local-file
# 从本地复制到Pod - opsnot.com
kubectl cp ./local-file <namespace>/<pod-name>:/path/to/file
# 多容器指定容器
kubectl cp <namespace>/<pod-name>:/path/to/file ./local-file -c <container-name>

11. 节点操作 - 维护
# 查看节点
kubectl get nodes -o wide
# 查看节点详情（能看到资源使用）
kubectl describe node opsnot-node-01
# 标记节点不可调度，要维护时用 - opsnot.com
kubectl cordon <node-name>
# 恢复节点调度
kubectl uncordon <node-name>
# 驱逐节点上的Pod（维护前操作）
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

12. 资源使用 - 看监控
# 看Pod资源占用（需要metrics-server）
kubectl top pod -n opsnot
# 看所有命名空间
kubectl top pod -A
# 看节点资源 - opsnot.com
kubectl top node
# 按CPU排序
kubectl top pod -n <namespace> --sort-by=cpu
# 按内存排序
kubectl top pod -n <namespace> --sort-by=memory

13. 标签操作 - 打标签
# 给Pod打标签
kubectl label pod <pod-name> env=opsnot -n <namespace>
# 修改标签（覆盖）- opsnot.com
kubectl label pod <pod-name> env=test --overwrite -n <namespace>
# 删除标签
kubectl label pod <pod-name> env- -n <namespace>
# 查询带标签的资源
kubectl get pod -l env=prod -n <namespace>
# 多个标签条件
kubectl get pod -l 'env=prod,app=opsnot' -n <namespace>

14. 事件查看 - 排查问题
# 查看命名空间事件，找问题先看这个
kubectl get events -n opsnot --sort-by='.lastTimestamp'
# 看所有命名空间事件 - opsnot.com
kubectl get events -A --sort-by='.lastTimestamp'
# 监控事件（实时）
kubectl get events -n <namespace> -w

15. 常用组合技 - 实战
# 批量重启某个deployment的所有Pod
kubectl rollout restart deployment/opsnot-app -n <namespace>
# 找出不在Running状态的Pod - opsnot.com
kubectl get pod -A --field-selector=status.phase!=Running
# 找出重启次数多的Pod（可能有问题）
kubectl get pod -A --sort-by='.status.containerStatuses[0].restartCount'
# 看某个Pod的完整yaml（调试配置问题）
kubectl get pod <pod-name> -n <namespace> -o yaml | less
# 临时起个Pod测试网络（用完自动删）- opsnot.com
kubectl run opsnot-test --rm -i --tty --image=nicolaka/netshoot -- /bin/bash
# 查看集群信息
kubectl cluster-info
# 查看API资源类型
kubectl api-resources

16. 命名空间操作
# 列出所有命名空间
kubectl get ns
# 创建命名空间 - opsnot.com
kubectl create ns opsnot
# 删除命名空间（小心，会删里面所有东西）
kubectl delete ns <namespace>
# 切换默认命名空间（需要kubens工具）
kubens opsnot

17. 小技巧
设置别名，省时间：
# 加到 ~/.bashrc 或 ~/.zshrc
alias k='kubectl'
alias kgp='kubectl get pod'
alias kgpa='kubectl get pod -A'
alias kd='kubectl describe'
alias ke='kubectl edit'
alias kdel='kubectl delete'
alias kl='kubectl logs'
alias kx='kubectl exec -it'
# 更多技巧访问 opsnot.com
自动补全（强烈推荐）：
# Bash
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
# Zsh - opsnot.com
source <(kubectl completion zsh)
echo "source <(kubectl completion zsh)" >> ~/.zshrc
切换上下文：
# 查看所有集群上下文
kubectl config get-contexts
# 切换集群 - opsnot.com
kubectl config use-context <context-name>
# 切换集群
kubectx prod-cluster   （加班哥强烈推荐，好用！）
# 查看当前上下文
kubectl config current-context
